#pragma once

#include<iostream>
#include<string>
#include <strings.h>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

using namespace std;
namespace Client
{ 
   class udpClient
   {public:
      udpClient(const string&serverip,const uint16_t &serverport):_serverip(serverip),_serverport(serverport),_sockfd(-1),_quit(false)
    {} 
    void initClient()
    {
        _sockfd=socket(AF_INET,SOCK_DGRAM,0);
        if (_sockfd == -1)
            {
                cerr << "socket error: " << errno << " : " << strerror(errno) << endl;
                exit(2);
            }
            cout << "socket success: " << " : " << _sockfd << endl;
        //客户端不用绑定，因为os自带绑定，因为服务端的端口只有一个，而有多个客户端
    }
    void run()
    {
        struct sockaddr_in server;
        memset(&server,0,sizeof(server));
        server.sin_family=AF_INET;
        server.sin_addr.s_addr=inet_addr(_serverip.c_str());
        server.sin_port=htons(_serverport);//获取到服务端的ip和端口
        string message;
      char cmdline[1024];
      while(!_quit)
      {
        //cout<<"please enter# ";
        fprintf(stderr,"enter#");
        fflush(stderr);
        fgets(cmdline,sizeof(cmdline),stdin);//这样不会读取到回车
         cmdline[strlen(cmdline)-1]=0;
         message=cmdline;
        sendto(_sockfd,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));
        //客户端发消息
        char buffer[1024];
          struct sockaddr_in temp;//获取服务器的信息
          socklen_t temp_len = sizeof(temp);
          size_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&temp, &temp_len);//客户端需要接收服务端的返回，接收服务端的信息，收发用的是一个客户端的文件描述符
          if (n >= 0)
              buffer[n] = 0;
          cout <<"服务器的翻译结果"<< buffer << endl;
      }
      




    }
    ~udpClient()
    {}



   

    private:
      int _sockfd;//决定传输的路径，用UDP的方式传输
      string _serverip;
      uint16_t _serverport;
      bool _quit;
   };








}
